package com.example.springboot.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 功能：时间工具

 * 日期：2024/1/27 21:09
 */

public class DateUtil {

    public static Date getStartOfLastWeek() {
        // 获取当前日期时间
        Date currentDate = new Date();

        // 创建 Calendar 对象并设置为当前时间
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(currentDate);

        // 将日期向前推 7 天
        calendar.add(Calendar.DAY_OF_YEAR, -6);

        // 设置时间为当天的开始时刻
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        // 获取前一周的最开始时刻
        return calendar.getTime();
    }

    // 获取今天的开始时间（00:00:00）
    public static Date getTodayStartTime(String dateString) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date today = dateFormat.parse(dateString);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(today);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        return calendar.getTime();
    }

    // 获取今天的结束时间（23:59:59）
    public static Date getTodayEndTime(String dateString) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date today = dateFormat.parse(dateString);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(today);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);

        return calendar.getTime();
    }

    /**
     * 功能：把后端的时间Date类型的数据转为String类型
     * 这样就可以把字符串传给数据库，就可以给数据库的datetime类型传值了
     *
     * @param currentTime
     * @return
     */
    //将Date类型的currentTime转换成字符串类型的日期
    public static String getStringDate(Date currentTime) {
        //如果currentTime为空，则返回null
        if (currentTime == null) {
            return null;
        }
        //创建SimpleDateFormat对象，指定日期格式
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //将currentTime按照指定格式转换成字符串
        String dateString = formatter.format(currentTime);
        //返回转换后的字符串
        return dateString;
    }

    /**
     * 功能：把后端的时间Date类型的数据转为String类型
     * 这样就可以把字符串传给数据库，就可以给数据库的datetime类型传值了
     *
     * @param currentTime
     * @return
     */
    //将Date类型的currentTime转换成字符串类型的日期
    public static String getStringDateSimple(Date currentTime) {
        //如果currentTime为空，则返回null
        if (currentTime == null) {
            return null;
        }
        //创建SimpleDateFormat对象，指定日期格式
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        //将currentTime按照指定格式转换成字符串
        String dateString = formatter.format(currentTime);
        //返回转换后的字符串
        return dateString;
    }

    public static String getStartOfRecentDaysAsString(int numDays) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_YEAR, -numDays); // 获取最近numDays天前的日期

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(calendar.getTime());
    }

    public static String getEndOfRecentDaysAsString() {
        Calendar calendar = Calendar.getInstance();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(calendar.getTime());
    }

    public static List<String> getRecentDaysAsString(int numDays) {
        List<String> recentDays = new ArrayList<>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Calendar calendar = Calendar.getInstance();
        for (int i = 0; i < numDays; i++) {
            recentDays.add(sdf.format(calendar.getTime()));
            calendar.add(Calendar.DAY_OF_YEAR, -1);
        }

        return recentDays;
    }


    public static String getStartOfDayFormatted() {
        // 获取今天的日期
        LocalDate today = LocalDate.now();

        // 获取今天的起始时间（00:00:00）
        LocalDateTime startOfDay = today.atStartOfDay();

        // 定义时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 格式化起始时间
        return startOfDay.format(formatter);
    }


    public static String getEndOfDayFormatted() {
        // 获取今天的日期
        LocalDate today = LocalDate.now();

        // 获取今天的结束时间（23:59:59）
        LocalDateTime endOfDay = LocalDateTime.of(today, LocalTime.MAX);

        // 定义时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 格式化结束时间
        return endOfDay.format(formatter);
    }

    public static String getCurrentDateTime(String format) {
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return now.format(formatter);
    }


    // 获取今日的起始时间
    public static Date getStartOfToday() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 0); // 今日的零点
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }

    // 获取今日的最后时间
    public static Date getEndOfToday() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 23); // 今日的最后时间
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return calendar.getTime();
    }
}
